package icu.lookyousmileface.proxy;

import org.springframework.beans.factory.annotation.Autowired;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @author starrysky
 * @title: ProxyHandler
 * @projectName spring5
 * @description: TODO
 * @date 2021/2/223:27
 */
///用这个类，自动生成代理
public class ProxyHandler implements InvocationHandler {

    // Foo f =(Foo) Proxy.NewProxyInstance(Foo. Class.GetClassLoader(),
    // new Class<?>[] { Foo.Class },
    // handler);


    @Autowired
    private Object target;

    public ProxyHandler() {

    }

    public void setProxy(Host host){
        this.target = host;
    }
    // 得到生成的代理类
    public Object getProxy(){
        // newProxyInstance() -> 生成代理对象，就不用再写具体的代理类了
        // this.getClass().getClassLoader() -> 找到加载类的位置
        // hostMaster.getClass().getInterfaces() -> 代理的具体接口
        // this -> 代表了接口InvocationHandler的实现类ProxyInvocationHandler
        return  Proxy.newProxyInstance(this.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
    }
    // 处理代理实例并返回结果
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 动态代理的本质，就是使用反射机制实现的
        // invoke()执行它真正要执行的方法
        Object result = method.invoke(target, args);
        fare();
        return result;
    }

    public void fare(){
        System.out.println("收取中介费！");
    }
}
